home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / qa / src / aoi_lib1.c < prev    next >
C/C++ Source or Header  |  1993-07-08  |  12KB  |  479 lines

  1. // 葵ライブラリ                            /////  Tab Size : 4  /////
  2. //                                      /////  Margin : 120  /////
  3. // aoi_lib1.c    v1.0 L11
  4. //
  5. // (C)K.Konishi    07-Nov-92
  6. //
  7.  
  8. #define    LIB
  9.  
  10. #include <EGB.h>
  11. #include <MOS.h>
  12. #include "aoi_lib1.h"
  13. #include <string.h>
  14. #include <stdlib.h>
  15. #include <time.h>
  16. #include <conio.h>
  17. #include <msdos.cf>
  18.  
  19. // #define    TEST
  20. // 上の行の // を取るとサンプルプログラムが出来上がります。
  21.  
  22.  
  23. #define    MDCL1     1    // 色の名前
  24. #define    MDCL2     2
  25. #define    MDCL3     3
  26. #define    MDCL4     4
  27. #define    MDCL5     5
  28. #define    MDCL6     9    // 6から9に変えています
  29. #define    MDCL7     7
  30.  
  31. #define    BLACK     8
  32. #define    BLUE     9
  33. #define    RED        10
  34. #define    PURPLE    11
  35. #define    GREEN    12
  36. #define    SKYBLUE    13
  37. #define    YELLOW    14
  38. #define    WHITE    15
  39.  
  40.  
  41. int AOIstring(short x, short y, AOIstringData *Data, char *tx)
  42. {
  43.     AOIstringData Dt = *Data;
  44.     EGB_color(work, 0, Dt.sc);
  45.     EGB_fontStyle(work, Dt.ss);
  46.     EGB_textZoom(work, 1, Dt.sx, Dt.sy);
  47.     EGB_textZoom(work, 0, Dt.ax, Dt.ay);
  48.     WORD(para + 0) = x;
  49.     WORD(para + 2) = y;
  50.     WORD(para + 4) = strlen(tx);
  51.     strcpy((para + 6), tx);
  52.     return EGB_sjisString(work, para);
  53. }
  54.  
  55. int AOIline(short x0, short y0, short x1, short y1, short c)
  56. {
  57.     EGB_color(work, 0, c);
  58.     WORD(para + 0) = 2;
  59.     WORD(para + 2) = x0;
  60.     WORD(para + 4) = y0;
  61.     WORD(para + 6) = x1;
  62.     WORD(para + 8) = y1;
  63.     return EGB_connect(work, para);
  64. }
  65.  
  66. int AOIconnectLeft(short x0, short y0, short x1, short y1, short c)
  67. {
  68.     EGB_color(work, 0, c);
  69.     WORD(para +  0) = 3;
  70.     WORD(para +  2) = x0;
  71.     WORD(para +  4) = y1;
  72.     WORD(para +  6) = x0;
  73.     WORD(para +  8) = y0;
  74.     WORD(para + 10) = x1;
  75.     WORD(para + 12) = y0;
  76.     return EGB_connect(work, para);
  77. }
  78.  
  79. int AOIconnectRight(short x0, short y0, short x1, short y1, short c)
  80. {
  81.     EGB_color(work, 0, c);
  82.     WORD(para +  0) = 3;
  83.     WORD(para +  2) = x0;
  84.     WORD(para +  4) = y1;
  85.     WORD(para +  6) = x1;
  86.     WORD(para +  8) = y1;
  87.     WORD(para + 10) = x1;
  88.     WORD(para + 12) = y0;
  89.     return EGB_connect(work, para);
  90. }
  91.  
  92. int AOIbox(short x0, short y0, short x1, short y1, short c)
  93. {
  94.     EGB_color(work, 0, c);
  95.     WORD(para +  0) = x0;
  96.     WORD(para +  2) = y0;
  97.     WORD(para +  4) = x1;
  98.     WORD(para +  6) = y1;
  99.     return EGB_rectangle(work, para);
  100. }
  101.  
  102. int AOIboxFull(short x0, short y0, short x1, short y1, short c)
  103. {
  104.     int ret = 0;
  105.     
  106.     ret = EGB_color(work, 0, c);
  107.     for (; y0 <= y1; y0++) {
  108.         WORD(para + 0) = 2;
  109.         WORD(para + 2) = x0;
  110.         WORD(para + 4) = y0;
  111.         WORD(para + 6) = x1;
  112.         WORD(para + 8) = y0;
  113.         ret += EGB_connect(work, para);
  114.     }
  115.     return ret;
  116. }
  117.  
  118. int AOIwinBase(short x, short y, short lx, short ly, short sd)
  119. {
  120.     int i;
  121.     
  122.     if (sd == 1) {
  123.         EGB_pastel(work, 128);
  124.         i = AOIboxFull(x + lx + 1, y + 6, x + lx + 6, y + ly + 7, MDCL1)
  125.         |    AOIboxFull(x + 6, y + ly + 1, x + lx + 6, y + ly + 7, MDCL1);
  126.     }
  127.     return    i
  128.         |    AOIboxFull(x, y, x + lx, y + ly, MDCL6)
  129.         |    AOIconnectLeft (x    , y    , x + lx - 1, y + ly - 1, WHITE)
  130.         |    AOIconnectRight(x    , y    , x + lx    , y + ly    , MDCL1)
  131.         |    AOIconnectLeft (x + 4, y + 4, x + lx - 5, y + ly - 5, MDCL1)
  132.         |    AOIconnectRight(x + 4, y + 4, x + lx - 4, y + ly - 4, WHITE);
  133. }
  134.  
  135. int AOIbuttonBase(short x, short y, short lx, short ly)
  136. {
  137.     return    AOIboxFull(x + 1, y + 1, x + lx - 1, y + ly - 1, MDCL6)
  138.         |    AOIconnectLeft (x, y, x + lx - 1, y + ly - 1, WHITE)
  139.         |    AOIconnectRight(x, y, x + lx    , y + ly    , MDCL1);
  140. }
  141.  
  142. int AOIsetPalette(int cn, int cg, int cr, int cb)
  143. {
  144.     DWORD(para + 0) = 1;
  145.     DWORD(para + 4) = cn;                 /* cn 色識別番号 */
  146.     BYTE(para +  8) = cb * 17;            /* cb  青 */
  147.     BYTE(para +  9) = cr * 17;            /* cr  赤 */
  148.     BYTE(para + 10) = cg * 17;          /* cg  緑 */
  149.     BYTE(para + 11) = 0;
  150.     return EGB_palette(work, 1, para);    /* display レイヤ表示 */
  151. }
  152.  
  153. int AOIsetPalette256(int cn, int cg, int cr, int cb)
  154. {
  155.     DWORD(para + 0) = 1;
  156.     DWORD(para + 4) = cn;                 /* cn 色識別番号 */
  157.     BYTE(para +  8) = cb * 257;            /* cb  青 */
  158.     BYTE(para +  9) = cr * 257;            /* cr  赤 */
  159.     BYTE(para + 10) = cg * 257;          /* cg  緑 */
  160.     BYTE(para + 11) = 0;
  161.     return EGB_palette(work, 1, para);    /* display レイヤ表示 */
  162. }
  163.  
  164. int AOIcolorIGRB(int g, int r, int b)
  165. {
  166.     return EGB_colorIGRB(work, 0, g * 0x10000 + r * 0x100 + b);
  167. }
  168.  
  169. int AOIsetStandardPalette(void)
  170. {
  171.     return    AOIsetPalette( 8,  0,  0,  0)
  172.         |    AOIsetPalette( 9,  0,  0, 15)
  173.         |    AOIsetPalette(10,  0, 15,  0)
  174.         |    AOIsetPalette(11,  0, 15, 15)
  175.         |    AOIsetPalette(12, 15,  0,  0)
  176.         |    AOIsetPalette(13, 15,  0, 15)
  177.         |    AOIsetPalette(14, 15, 15,  0)
  178.         |    AOIsetPalette(15, 15, 15, 15);
  179. }
  180.  
  181. void AOIsetButton(AOIbuttonData *Data, short x, short y, short lx, short ly)
  182. {
  183.     AOIbuttonData bData;
  184.  
  185.     bData.x  = x;
  186.     bData.y  = y;
  187.     bData.lx = lx;
  188.     bData.ly = ly;
  189.     *Data = bData;
  190. }
  191.  
  192. int AOIbutton(short sx, short sy, int mx, int my, AOIbuttonData *Data)
  193. {
  194.     AOIbuttonData *Dt = Data;
  195.     int i;
  196.     
  197.     for (i = 0; i <= BUTTON; i++) {
  198.         if (sx + Dt[i].x < mx && mx < sx + Dt[i].x + Dt[i].lx && sy + Dt[i].y < my && my < sy + Dt[i].y + Dt[i].ly) {
  199.             return i;
  200.         }
  201.     }
  202.     return -1;
  203. }
  204.  
  205. void _AOIfigureDrawSet(short *fig, short *a)
  206. {
  207.     short *da = a;
  208.     
  209.     switch (*fig) {
  210.         case 0 :
  211.             da[1] = da[2] = da[3] = da[4] = da[5] = da[7] = 1;
  212.             break;
  213.         case 1 :
  214.             da[4] = da[5] = 1;
  215.             break;
  216.         case 2 :
  217.             da[1] = da[4] = da[6] = da[3] = da[7] = 1;
  218.             break;
  219.         case 3 :
  220.             da[1] = da[4] = da[6] = da[5] = da[7] = 1;
  221.             break;
  222.         case 4 :
  223.             da[2] = da[6] = da[4] = da[5] = 1;
  224.             break;
  225.         case 5 :
  226.             da[1] = da[2] = da[6] = da[5] = da[7] = 1;
  227.             break;
  228.         case 6 :
  229.             da[1] = da[2] = da[3] = da[6] = da[5] = da[7] = 1;
  230.             break;
  231.         case 7 :
  232.             da[1] = da[2] = da[4] = da[5] = 1;
  233.             break;
  234.         case 8 :
  235.             da[1] = da[2] = da[3] = da[4] = da[5] = da[6] = da[7] = 1;
  236.             break;
  237.         case 9 :
  238.             da[1] = da[2] = da[4] = da[5] = da[6] = da[7] = 1;
  239.             break;
  240.     }
  241. }
  242.  
  243. void AOIfigureDraw(short sx, short sy, short figure)
  244. {    // 2桁の数字を12ドットで表示します
  245.     short    a[8];
  246.     short    fig[3];        // fig[1] : 10の位        fig[2] : 1の位
  247.     short    i, j;
  248.     
  249.     for (i = 0; i <= 7; i++) a[i] = 0;
  250.     for (i = 0; i <= 2; i++) fig[i] = 0;
  251.  
  252.     if (figure < 0) figure = 0;    //    負の数は0にする
  253.  
  254.     fig[1] = figure / 10;
  255.     fig[2]  = figure - fig[1] * 10;
  256.     for (i = 1; i != 3; i++) {
  257.         _AOIfigureDrawSet(&fig[i], a);
  258.         
  259.         if (i == 2) sx += 10;
  260.         
  261.         AOIline(sx + 1, sy     , sx + 5, sy     , a[1] == 1 ? 15 : 8);
  262.         AOIline(sx    , sy     , sx    , sy +  5, a[2] == 1 ? 15 : 8);
  263.         AOIline(sx    , sy +  7, sx    , sy + 12, a[3] == 1 ? 15 : 8);
  264.         AOIline(sx + 6, sy     , sx + 6, sy +  5, a[4] == 1 ? 15 : 8);
  265.         AOIline(sx + 6, sy +  7, sx + 6, sy + 12, a[5] == 1 ? 15 : 8);
  266.         AOIline(sx + 1, sy +  6, sx + 5, sy +  6, a[6] == 1 ? 15 : 8);
  267.         AOIline(sx + 1, sy + 12, sx + 5, sy + 12, a[7] == 1 ? 15 : 8);
  268.         for (j = 0; j <= 7; j++) a[j] = 0;
  269.     }
  270. }
  271.  
  272. void AOIfigureDraw2(short sx, short sy, int figure)    // 2桁の数字を25ドットで表示します
  273. {
  274.     short    a[8];
  275.     short    fig[3];        // fig[1] : 10の位        fig[2] : 1の位
  276.     short    i, j, k;
  277.     short    m = 0, n;
  278.     
  279.     for (i = 0; i <= 7; i++) a[i] = 0;
  280.     for (i = 0; i <= 2; i++) fig[i] = 0;
  281.  
  282.     if (figure < 0) figure = 0;    //    負の数は0にする
  283.  
  284.     fig[1] = figure / 10;
  285.     fig[2] = figure - fig[1] * 10;
  286.     for (i = 1; i != 3; i++) {
  287.         _AOIfigureDrawSet(&fig[i], a);
  288.         
  289.         if (i == 2) sx += 20;
  290.         for (k = 0; k < 4; k++) {
  291.             sx += k;
  292.             if (k == 0 || k == 3) m = 1;
  293.             else m = 0;
  294.             for (n = 0; n < 2; n++) {
  295.                 AOIline(sx + n * 11, sy +  3 + m, sx + n * 11, sy + 11 - m,    a[2 + n * 2] == 1 ? 14 : 8);
  296.                 AOIline(sx + n * 11, sy + 14 + m, sx + n * 11, sy + 22 - m,    a[3 + n * 2] == 1 ? 14 : 8);
  297.             }
  298.             sx -= k;
  299.         }
  300.         for (k = 0; k < 4; k++) {
  301.             sy += k;
  302.             if (k == 0 || k == 3) m = 1;
  303.             else m = 0;
  304.             AOIline(sx + 3 + m, sy     , sx + 11 - m, sy     , a[1] == 1 ? 14 : 8);
  305.             AOIline(sx + 3 + m, sy + 11, sx + 11 - m, sy + 11, a[6] == 1 ? 14 : 8);
  306.             AOIline(sx + 3 + m, sy + 22, sx + 11 - m, sy + 22, a[7] == 1 ? 14 : 8);
  307.             sy -= k;
  308.         }
  309.         for (j = 0; j <= 7; j++) a[j] = 0;
  310.     }
  311. }
  312.  
  313. short _AOIrandom(short max)    //    0~99までの特殊用途乱数発生
  314. {    
  315.     short i10, max10, ret;
  316.     
  317.     max10 = max / 10;
  318.     while((i10 = rand() % 10) >= max10);
  319.     ret = i10 * 10 + (rand() % 10);
  320.     if (ret >= max) return _AOIrandom(max);
  321.     return ret;
  322. }
  323.  
  324. long AOIrandom(long max)    //    0~999999までの乱数発生
  325. {
  326.     time_t *t = 0;
  327.     
  328.     srand((unsigned int)time(t));
  329.     if (max > 9999) {
  330.         return _AOIrandom(max / 10000) * 10000
  331.              + _AOIrandom(99) * 100
  332.              + _AOIrandom(99);
  333.     }
  334.     if (max > 99) {
  335.         return _AOIrandom(max / 100) * 100
  336.              + _AOIrandom(99);
  337.     }
  338.     return _AOIrandom(99);
  339. }
  340.  
  341. int AOIbuttonLamp(short sx, short sy, AOIbuttonData *Data)    //    ボタン部分を反転
  342. {
  343.     AOIbuttonData Dt = *Data;
  344.     
  345.     return    EGB_writeMode(work, 4)
  346.         |    MOS_disp(0)
  347.         |    AOIboxFull(sx + Dt.x, sy + Dt.y, sx + Dt.x + Dt.lx, sy + Dt.y + Dt.ly, 15)
  348.         |    MOS_disp(1)
  349.         |    EGB_writeMode(work, 0);
  350. }
  351.  
  352. int AOIgetGraph(char *buf, short x0, short y0, short x1, short y1)    // 画像データ画面の読み込み
  353. {
  354.     DWORD(para +  0) = (unsigned int)buf;
  355.     WORD (para +  4) = getds();
  356.     WORD (para +  6) = x0;
  357.     WORD (para +  8) = y0;
  358.     WORD (para + 10) = x1;
  359.     WORD (para + 12) = y1;
  360.     return EGB_getBlock(work, para);            //    ドットデータの読み込み1
  361.  
  362. }
  363.  
  364. int AOIputGraph(char *buf, short x0, short y0, short x1, short y1)    //    画像データ画面の書き込み
  365. {
  366.     DWORD(para +  0) = (unsigned int)buf;
  367.     WORD (para +  4) = getds();
  368.     WORD (para +  6) = x0;
  369.     WORD (para +  8) = y0;
  370.     WORD (para + 10) = x1;
  371.     WORD (para + 12) = y1;
  372.     return EGB_putBlock(work, 0, para);        //    ドットデータの書き込み1
  373. }
  374.  
  375. void AOIwindowMove(char *dispTmp, short *sx, short *sy, short lx, short ly)    //    ウインドゥ移動
  376. {
  377.     int    ch, mx, my;
  378.     int dx, dy;
  379.     char dispTmp2[(640/8)*480];                //  ドットデータの読み書き作業領域
  380.  
  381.     MOS_disp(0);
  382.     AOIgetGraph(dispTmp2, *sx, *sy, *sx + lx + 7, *sy + ly + 7);
  383.     AOIputGraph(dispTmp, *sx, *sy, *sx + lx + 7, *sy + ly + 7);
  384.     MOS_typeRom(83 + 1, 8, 8, pat_work);    // マウスを手の平に
  385.     MOS_disp(1);
  386.     EGB_writeMode(work, 4);
  387.     EGB_linePattern(work, 1, 0x55555555);
  388.  
  389.     MOS_rdpos(&ch, &mx, &my);
  390.     dx = mx - *sx;
  391.     dy = my - *sy;
  392.  
  393.     do {
  394.         MOS_rdpos(&ch, &mx, &my);
  395.         *sx = mx - dx;
  396.         *sy = my - dy;
  397.         MOS_disp(0);
  398.         AOIbox(*sx, *sy, *sx + lx, *sy + ly, WHITE);
  399.         AOIbox(*sx, *sy, *sx + lx, *sy + ly, WHITE);
  400.         MOS_disp(1);
  401.     } while (ch == 1);
  402.     
  403.     EGB_linePattern(work, 1, 0xffffffff);
  404.     EGB_writeMode(work, 0);
  405.     MOS_disp(0);
  406.     MOS_typeRom(80 + 1, 0, 0, pat_work);    // マウスを元通り
  407.     AOIgetGraph(dispTmp, *sx, *sy, *sx + lx + 7, *sy + ly + 7);
  408.     AOIputGraph(dispTmp2, *sx, *sy, *sx + lx + 7, *sy + ly + 7);
  409.     MOS_disp(1);
  410. }
  411.  
  412. short AOItownsName(void)    //    TOWNSの機種判別
  413. {
  414.     short m;
  415.     
  416.     switch (m = _inp(0x31)) {
  417.         case 1..5 :
  418.             break;
  419.         default :
  420.             m = 0;    break;
  421.     }
  422.     return m;    //    1 : 初代   2 : 2代目   3 : 3代目   4 : IIUX   5 : IICX
  423. }
  424.  
  425.  
  426. // サンプルプログラムは 13行目の // を取ってください
  427.  
  428. #ifdef    TEST
  429.  
  430. void main(void)
  431. {
  432.     AOIstringData    AstringD;    // AOIstringData型の変数宣言
  433.     int i;
  434.     
  435.     EGB_init(work, EgbWorkSize);
  436.     EGB_resolution(work, 0, 3);
  437.     EGB_resolution(work, 1, 3);
  438.     EGB_writePage(work, 0);
  439.     
  440.     AOIsetPalette( 1,  1,  1, 15);
  441.     AOIsetPalette( 2,  3,  3, 15);
  442.     AOIsetPalette( 3,  5,  5, 15);
  443.     AOIsetPalette( 4,  7,  7, 15);
  444.     AOIsetPalette( 5,  9,  9, 15);
  445.     AOIsetPalette( 6, 11, 11, 15);
  446.     AOIsetPalette( 7, 13, 13, 15);
  447.     AOIsetStandardPalette();
  448.     
  449.     for (i = 0; i <= 450; i+= 30) AOIboxFull(0, i, 639, i + 30, i / 30);    
  450.  
  451.     AstringD.sx = 16;                    // AOIstring使用例
  452.     AstringD.sy = 16;
  453.     AstringD.ax =  8;
  454.     AstringD.ay = 16;
  455.     AstringD.sc = 15;
  456.     AstringD.ss = 0x02;
  457.     AOIstring(100, 100, &AstringD, "あいうえおjkjkjk");
  458.  
  459.     AOIline(0, 0, 639, 399, 6);                    // AOIline使用例
  460.  
  461.     AOIbox(100, 100, 200, 399, 7);                // AOIbox使用例
  462.  
  463.     AOIboxFull(201, 100, 599, 200, 1);            // AOIboxFull使用例
  464.  
  465.     AOIwinBase(250, 150, 350, 200, 1);            // AOIwinBase使用例
  466.  
  467.     AOIbuttonBase(255, 155, 340, 16);        // AOIbuttonBase使用例
  468.  
  469.     AstringD.sx = 12;                    // AOIstring使用例
  470.     AstringD.sy = 12;
  471.     AstringD.ax =  6;
  472.     AstringD.ay = 12;
  473.     AstringD.sc = BLACK;
  474.     AstringD.ss = 0x01;
  475.     AOIstring(300, 168, &AstringD, "ウインドゥの試作版です");
  476. }
  477.  
  478.  
  479. #endif